package com.hackathon2012_03_04.ryokocial;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;

/**
 * サムネイル
 */
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Thumbnail {

	/**
     * ID
     */
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Long id;

    /**
     * 作成日時
     */
    @Persistent
    private java.util.Date createDate;

    /**
     * オリジナル画像
     */
    @Persistent
    private com.google.appengine.api.datastore.Blob original;

    /**
     * サムネイル
     */
    @Persistent
    private com.google.appengine.api.datastore.Blob small;

    /**
     * 画像種別
     */
    @Persistent
    private String type = "";
    
    /**
     * 画像名
     */
    @Persistent
    private String caption;
    
    /**
     * ユーザ名
     */
    @Persistent
    private String user;
    
    /**
     * タグ
     */
    @Persistent
    private ArrayList<String> tags;
    
    /**
     * 緯度
     */
    @Persistent
    private double lat;
    
    /**
     * 経度
     */
    @Persistent
    private double lng;
    
    /*
    @Persistent(mappedBy = "dept")
    List<UserData> users;  // 1対多
    ?

    /**
     * コンストラクタ
     */
    public Thumbnail (){}

    /**
     * コンストラクタ
     *
     * @param original
     *        オリジナル画像
     * @param small
     *        サムネイル(小)
     * @param large
     *        サムネイル(大)
     * @param type
     *        画像種別
     * @param createDate
     *        作成日時
     */
    
    public Thumbnail (
        com.google.appengine.api.datastore.Blob original,
        com.google.appengine.api.datastore.Blob small,
        String type,
        java.util.Date createDate ,
        String caption,
        String user,
        ArrayList<String> tags,
        double lat,
        double lng) 
    {
        this.original = original;
        this.small = small;
        this.type = type;
        this.createDate = createDate;  
        this.caption=caption;
        this.user=user;
        this.tags=tags;
        this.lat=lat;
        this.lng=lng;
    }
    /**
     * コンストラクタ
     *
     * @param id
     *        ID
     * @param original
     *        オリジナル画像
     * @param small
     *        サムネイル(小)
     * @param large
     *        サムネイル(大)
     * @param type
     *        画像種別
     * @param createDate
     *        作成日時
     */
    public Thumbnail (
        Long id,
        com.google.appengine.api.datastore.Blob original,
        com.google.appengine.api.datastore.Blob small,
        com.google.appengine.api.datastore.Blob large,
        String type,
        java.util.Date createDate ) {
        this.id = id;
        this.original = original;
        this.small = small;
        this.type = type;
        this.createDate = createDate;
    }
    
    public Thumbnail (
    		Long id,
            com.google.appengine.api.datastore.Blob original,
            com.google.appengine.api.datastore.Blob small,
            String type,
            java.util.Date createDate ,
            String caption,
            String user,
            ArrayList<String> tags,
            double lat,
            double lng) 
        {
            this.original = original;
            this.small = small;
            this.type = type;
            this.createDate = createDate;  
            this.caption=caption;
            this.user=user;
            this.tags=tags;
            this.lat=lat;
            this.lng=lng;
        }

    /**
     * IDを取得する。
     * @return ID
     */
    public Long getId () {
        return id;
    }
    /**
     * IDを設定する。
     * @param id ID
     */
    public void setId ( Long id ) {
        this.id = id;
    }
    /**
     * ä½ææ¥æãåå¾ããã
     * @return ä½ææ¥æ
     */
    public java.util.Date getCreateDate () {
        return createDate;
    }
    /**
     * ä½ææ¥æãè¨­å®ããã
     * @param createDate ä½ææ¥æ
     */
    public void setCreateDate ( java.util.Date createDate ) {
        this.createDate = createDate;
    }
    /**
     * ãªãªã¸ãã«ç»åãåå¾ããã
     * @return ãªãªã¸ãã«ç»å
     */
    public com.google.appengine.api.datastore.Blob getOriginal () {
        return original;
    }
    /**
     * ãªãªã¸ãã«ç»åãè¨­å®ããã
     * @param original ãªãªã¸ãã«ç»å
     */
    public void setOriginal ( com.google.appengine.api.datastore.Blob original ) {
        this.original = original;
    }
    /**
     * ãµã ãã¤ã«(å°)ãåå¾ããã
     * @return ãµã ãã¤ã«(å°)
     */
    public com.google.appengine.api.datastore.Blob getSmall () {
        return small;
    }
    /**
     * ãµã ãã¤ã«(å°)ãè¨­å®ããã
     * @param small ãµã ãã¤ã«(å°)
     */
    public void setSmall ( com.google.appengine.api.datastore.Blob small ) {
        this.small = small;
    }
    /**
     * ç»åç¨®å¥ãåå¾ããã
     * @return ç»åç¨®å¥
     */
    public String getType () {
        return type;
    }
    
    public String getCaption() {
		return caption;
	}

	public String getUser() {
		return user;
	}

	public ArrayList<String> getTags() {
		return tags;
	}

	public double getLat() {
		return lat;
	}

	public double getLng() {
		return lng;
	}

    
    /**
     * ç»åç¨®å¥ãè¨­å®ããã
     * @param type ç»åç¨®å¥
     */
    public void setType ( String type ) {
        this.type = type;
    }

    public void setCaption(String caption) {
		this.caption = caption;
	}

	public void setTags(ArrayList<String> tags) {
		this.tags = tags;
	}

	public boolean equals ( Object obj ) {
        if ( obj == null ) { return false; }
        if ( obj instanceof Thumbnail ) {
            Object[] that = getValues((Thumbnail) obj);
            return Arrays.deepEquals(that, getValues(this)) ;
        }
        return false;
    }
    public int hashCode () {
        return Arrays.deepHashCode(getValues(this)) ;
    }
    
	private static Object[] getValues( Thumbnail v) {
        return new Object[] {
            v.id,
            v.createDate,
            v.original,
            v.small,
            v.type
        };
    }
}